若是想要了解 SDN OpenFlow 以及 P4 請不要吝嗇點擊喜歡或是訂閱我喔!(訂閱又不收費XD)
未來有機會也可以跟大家分享我當網管的辛酸血淚史,可以讓人解決問題時可以參考我的文章。
話不多說,我們就累狗!!
前情提要 為甚麼 連不到其它的 host 呢?
就是 Parser的問題啦!!
parser MyParser(packet_in packet,
out headers hdr,
inout metadata meta,
inout standard_metadata_t standard_metadata) {
state start {
/* TODO: add parser logic */
transition accept;
}
}
我們要根據 Parser 來做封包的解譯 所以我們必須得根據我要用甚麼傳輸(i.e LAN, WLAN),
我的 Header格式是甚麼 (Ipv4, Ipv6...),我們這邊使用乙太網路、以及Ipv4的格式
所以我們這樣來寫 Parser的部分!
parser MyParser(packet_in packet,
out headers hdr,
inout metadata meta,
inout standard_metadata_t standard_metadata) {
state start {
transition parse_ethernet;
}
state parse_ethernet {
packet.extract(hdr.ethernet);
transition select(hdr.ethernet.etherType) {
TYPE_IPV4: parse_ipv4;
default: accept;
}
}
state parse_ipv4 {
packet.extract(hdr.ipv4);
transition accept;
}
}
還有 parser 解析完的動作 也就是他們的Action
如果不是屬於fowarding 它當然就是把它丟掉拉
action ipv4_forward(macAddr_t dstAddr, egressSpec_t port) {
/* TODO: fill out code in action body */
}
action ipv4_forward(macAddr_t dstAddr, egressSpec_t port) {
standard_metadata.egress_spec = port;
hdr.ethernet.srcAddr = hdr.ethernet.dstAddr;
hdr.ethernet.dstAddr = dstAddr;
hdr.ipv4.ttl = hdr.ipv4.ttl - 1;
}
"hdr.ipv4.ttl = hdr.ipv4.ttl - 1"
這行是甚麼意思 ttl 是指 time to live 也就是這個封包所含剩下的 hop 數,
若是這個封包跳了一次,它的ttl就-1以此類推,當ttl=0則封包會被丟棄。
apply {
if (hdr.ipv4.isValid()) {
ipv4_lpm.apply();
}
}
順便可以幫他檢查一下ipv4的標頭格式 合法才允許 apply
這樣我們就成功完成封包的轉發了!
也可以有效的解決 ping 不到的問題囉!
在此付上我的 Reference,我將會以簡短白話的方式來講解 P4 這套語言,若是你/妳不嫌棄可以訂閱我的發文
每天就根據我自己了解的程度來做發文的動作,如果自己對於 P4也有興趣可以先來預習,那我們明天見!
Reference :
P4_turtorial
[(http://docs.google.com/presentation/d/1zliBqsS8IOD4nQUboRRmF_19poeLLDLadD5zLzrTkVc/edit#slide=id.g37fca2850e_6_1802)]